//==========================================================================
// Copyright (c) 2000-2006,  Elastos, Inc.  All Rights Reserved.
//==========================================================================
#include <xllp_lcd.h>
#include <bulverde.h>
#include "display_def.h"
#include <util.h>
#include <udelay.h>

ulong_t GetGedrValue(long RegIdx)
{
    UINT GedrValue;

    //Drv_Assert(RegIdx >=0 && RegIdx < 4);
    switch (RegIdx) {
    case 0:
        GedrValue = GEDR0;
        break;
    case 1:
        GedrValue = GEDR1;
        break;
    case 2:
        GedrValue = GEDR2;
        break;
    default: // case 3:
        GedrValue = GEDR3;
        break;
    }

    return GedrValue;
}

void Gpio_SetDir(int gpio_num, int direction)
{

    if (gpio_num < 32)
    {
        if (direction == GPIO_PIN_IN)
            GPDR0 &= ~(1 << (gpio_num % 32));
        if (direction == GPIO_PIN_OUT)
            GPDR0 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 64)
    {
        if (direction == GPIO_PIN_IN)
            GPDR1 &= ~(1 << (gpio_num % 32));
        if (direction == GPIO_PIN_OUT)
            GPDR1 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 96)
    {
        if (direction == GPIO_PIN_IN)
            GPDR2 &= ~(1 << (gpio_num % 32));
        if (direction == GPIO_PIN_OUT)
            GPDR2 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 120)
    {
        if (direction == GPIO_PIN_IN)
            GPDR3 &= ~(1 << (gpio_num % 32));
        if (direction == GPIO_PIN_OUT)
            GPDR3 |= (1 << (gpio_num % 32));
        return;
    }
}

void Gpio_SetAFR(int gpio_num, int function)
{
    if (gpio_num < 16)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR0_L &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR0_L &= ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR0_L |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR0_L &= ~(1 << ((gpio_num % 16) * 2));
            GAFR0_L |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR0_L |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }
    if (gpio_num < 32)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR0_U &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR0_U &= ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR0_U |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR0_U &= ~(1 << ((gpio_num % 16) * 2));
            GAFR0_U |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR0_U |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }
    if (gpio_num < 48)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR1_L &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR1_L &= ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR1_L |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR1_L &= ~(1 << ((gpio_num % 16) * 2));
            GAFR1_L |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR1_L |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }
    if (gpio_num < 64)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR1_U &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR1_U &= ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR1_U |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR1_U &= ~(1 << ((gpio_num % 16) * 2));
            GAFR1_U |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR1_U |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }
    if (gpio_num < 80)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR2_L &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR2_L &= ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR2_L |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR2_L &= ~(1 << ((gpio_num % 16) * 2));
            GAFR2_L |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR2_L |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }
    if (gpio_num < 96)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR2_U &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR2_U = ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR2_U |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR2_U &= ~(1 << ((gpio_num % 16) * 2));
            GAFR2_U |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR2_U |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }
    if (gpio_num < 112)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR3_L &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR3_L &= ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR3_L |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR3_L &= ~(1 << ((gpio_num % 16) * 2));
            GAFR3_L |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR3_L |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }
    if (gpio_num < 120)
    {
        if (function == GPIO_AS_GPIO)
        {

            GAFR3_U &= ~((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        if (function == GPIO_AS_AF1)
        {

            GAFR3_U &= ~(1 << ((gpio_num % 16) * 2 + 1));
            GAFR3_U |= (1 << ((gpio_num % 16) * 2));
        }
        if (function == GPIO_AS_AF2)
        {

            GAFR3_U &= ~(1 << ((gpio_num % 16) * 2));
            GAFR3_U |= (1 << ((gpio_num % 16) * 2 + 1));
        }
        if (function == GPIO_AS_AF3)
        {

            GAFR3_U |= ((1 << ((gpio_num % 16) * 2)) | (1 << ((gpio_num % 16) * 2 + 1)));
        }
        return;
    }

}

void Gpio_SetOutLow(int gpio_num)
{

    if (gpio_num < 32)
    {
        GPCR0 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 64)
    {
        GPCR1 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 96)
    {
        GPCR2 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 120)
    {
        GPCR3 |= (1 << (gpio_num % 32));
        return;
    }
}

void Gpio_SetOutHigh(int gpio_num)
{
    if (gpio_num < 32)
    {
        GPSR0 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 64)
    {
        GPSR1 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 96)
    {
        GPSR2 |= (1 << (gpio_num % 32));
        return;
    }
    if (gpio_num < 120)
    {
        GPSR3 |= (1 << (gpio_num % 32));
        return;
    }
}

